home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / SoundAndMusic / cmix / model.instruments / reverbit.m < prev   
Text File  |  1991-12-09  |  2KB  |  67 lines

  1. #include "../H/ugens.h"
  2. #include "../H/sfheader.h"
  3. #include "../objc/Delay.h"
  4.  
  5. int NBYTES = 32768;
  6. extern SFHEADER sfdesc[NFILES];
  7.  
  8. id delayline;
  9.  
  10. /* a simple instrument which passes a two channel signal 
  11. through a reverb, and delays and reverbs some of it (with
  12. a time delay between speakers.  A nice way to gently and
  13. cheaply put some gloss on a signal.  Note that it uses
  14. a Delay object defined in the objc directory.  */
  15.  
  16. double reverbit(p,n_args)
  17. float *p;
  18. {
  19.     int i,j,nsamps,input1,input2,output;
  20.     float xin[4],out[4],amp1,amp2;
  21.     float array[7500],xx,reverbtime,reverbpct;
  22.     float samples[5000],yy,delaytime;
  23.     int delvals[2],nchans;
  24.  
  25.     /* p0=start, p1=dur, p2=inskip, p3=reverbtime, p4=reverbpercent p5=rightchannel delay*/
  26.     input1=0; output=1; 
  27.     
  28.     nsamps=setnote(p[0],p[1],output);  /* position outputfile*/
  29.     setnote(p[2],p[1],input1);       /* position inputfile1*/
  30.     nchans = sfchans(&sfdesc[0]);
  31.     reverbtime = p[3];
  32.     reverbpct = p[4];
  33.     delaytime = p[5];
  34.     [delayline size:.1 sRate:SR];
  35.  
  36.     rvbset(reverbtime,0,array);
  37.  
  38.     for(i=0; i<nsamps; i++) {
  39.         if(!GETIN(xin,input1))  break;  
  40.         if(nchans == 1) xin[1] = xin[0];
  41.         xx = -reverbpct * reverb(xin[0]+xin[1],array);
  42.         /* flip phase of reverberated signal */
  43.         [delayline put:xx];
  44.         yy = [delayline get:delaytime];
  45.         out[0] = xin[0] + xx;
  46.         out[1] = xin[1] + yy;
  47.         ADDOUT(out,output);
  48.     }
  49.     /* ring down reverb */
  50.     nsamps = reverbtime * SR;
  51.     for(i=0; i<=nsamps; i++) {
  52.         xx = reverbpct * reverb(0.,array);
  53.         [delayline put:xx];
  54.         yy = [delayline get:delaytime];
  55.         out[0] =  xx;
  56.         out[1] =  yy;
  57.         ADDOUT(out,output);
  58.     }
  59.     endnote(output);
  60. }
  61.  
  62. profile()
  63. {
  64.     UG_INTRO("reverbit",reverbit);
  65.     delayline = [Delay create];
  66. }
  67.